package com.spsy.order.controller;



import com.alibaba.fastjson2.JSON;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.spsy.common.core.domain.R;
import com.spsy.common.core.utils.StringUtils;
import com.spsy.order.constand.OrderRedisKey;
import com.spsy.order.domain.Cart;
import com.spsy.order.service.ICartService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.util.Map;


/**
 * @author: liuzhiping
 * @date: 2025/5/5 11:40
 **/
@Slf4j
@RestController
@RequestMapping("/order/redis")
public class OrderRedisController {

    @Autowired
    private RedisTemplate redisTemplate;


    @Autowired
    private ICartService iCartService;

    /***
     * 获取用户列表
     * @param userId
     * @return
     * @throws Exception
     */
    @GetMapping("/getUserCart")
    public  R  getUserCart(@RequestParam("userId") String userId) throws Exception{

        //根据userId获取购物车车信息
        String value = (String) this.redisTemplate.opsForValue().get(OrderRedisKey.ORDER_CART_USERID+userId);


        log.info("value:{}",value);

        if(StringUtils.isNull(value)){
            return R.ok();
        }

        Cart cart = JSON.parseObject(value,Cart.class);

        return R.ok(cart);

    }




    @GetMapping("/getUserCart2")
    public  R  getUserCart2(@RequestParam("userId") String userId) throws Exception{

        //根据userId获取购物车车信息
        String value = (String) this.redisTemplate.opsForValue().get(userId);


        log.info("value:{}",value);

        if(StringUtils.isNull(value)){
            return R.ok();
        }


        return R.ok(value);

    }







    @GetMapping("/addCart2")
    public  R  addCart2(@RequestParam("quantity") Integer quantity,
                       @RequestParam("prodcutId") Integer prodcutId,
                       @RequestParam("price") BigDecimal price,
                       @RequestParam("userId") Long userId

    ) throws Exception{



        //添加商品到购物车【添加到Redis中+添加mysql 表中】  【开发中】
        //1:获取用户的购物车
        //2：判断有没有这个商品，没有就添加；有，叠加
        //3：放回到redis中
        //4：插入数据到数据库

        String userReisKey = userId.longValue()+"";

        //根据userId获取购物车车信息
        String value = (String) this.redisTemplate.opsForValue().get(userReisKey);

        log.info("=========11111value:{}",value);

        Map<String,Integer> proMap = JSON.parseObject(value,Map.class);

        int redis_quautity = proMap.get(prodcutId.intValue()+"").intValue();
        int newQuautity  = (redis_quautity + quantity);

        proMap.put(prodcutId.intValue()+"",newQuautity);

        log.info("=========22222value:{}",JSON.toJSONString(proMap));

        //重新赋值
        this.redisTemplate.opsForValue().set(userReisKey,JSON.toJSONString(proMap));

        return R.ok();

    }



    @GetMapping("/addCart3")
    public  R  addCart3(@RequestParam("quantity") Integer quantity,
                        @RequestParam("prodcutId") Integer prodcutId,
                        @RequestParam("price") BigDecimal price,
                        @RequestParam("userId") Long userId

    ) throws Exception{



        //添加商品到购物车【添加到Redis中+添加mysql 表中】  【开发中】
        //1:获取用户的购物车
        //2：判断有没有这个商品，没有就添加；有，叠加
        //3：放回到redis中
        //4：插入数据到数据库

        String userReisKey = userId.longValue()+"";


        Object value = this.redisTemplate.opsForHash().get(userReisKey,prodcutId);

        return R.ok(value);

    }



    /***
     * 添加商品到购物车
     * @return
     * @throws Exception
     */
    @GetMapping("/addCart")
    public  R  addCart(@RequestParam("quantity") Long quantity,
                       @RequestParam("prodcutId") Long prodcutId,
                       @RequestParam("price") BigDecimal price,
                       @RequestParam("userId") Long userId

    ) throws Exception{



        //添加商品到购物车【添加到Redis中+添加mysql 表中】  【开发中】
        //1:获取用户的购物车
        //2：判断有没有这个商品，没有就添加；有，叠加
        //3：放回到redis中
        //4：插入数据到数据库

        String userReisKey = OrderRedisKey.ORDER_CART_USERID+userId;

        //根据userId获取购物车车信息
        String value = (String) this.redisTemplate.opsForValue().get(userReisKey);

        log.info("value:{}",value);
        Cart cart = JSON.parseObject(value,Cart.class);


        Long productIdOld = cart.getProductId();
        Long quantityOld = cart.getQuantity();

        if(prodcutId == productIdOld){
            Long newQuantity = quantityOld+quantity;
            cart.setQuantity(newQuantity);
        }else{
            //TODO:改造数据
            //覆盖
            cart.setProductId(prodcutId);
            cart.setQuantity(quantity);
        }

         //重新赋值
        this.redisTemplate.opsForValue().set(userReisKey,JSON.toJSONString(cart));

        //更新数据库
        this.iCartService.updateCart(cart);


        if(StringUtils.isNull(value)){
            return R.ok();
        }



        return R.ok(cart);

    }






    /***
     * 添加商品到购物车
     * @return
     * @throws Exception
     */
    @GetMapping("/delCart")
    public  R  delCart(@RequestParam("quantity") Long quantity,
                       @RequestParam("prodcutId") Long prodcutId,
                       @RequestParam("userId") Long userId

    ) throws Exception{



        //添加商品到购物车【添加到Redis中+添加mysql 表中】  【开发中】
        //1:获取用户的购物车
        //2：判断有没有这个商品，没有就添加；有，叠加
        //3：放回到redis中
        //4：插入数据到数据库

        String userReisKey = OrderRedisKey.ORDER_CART_USERID+userId;

        //根据userId获取购物车车信息
        String value = (String) this.redisTemplate.opsForValue().get(userReisKey);

        log.info("value:{}",value);
        Cart cart = JSON.parseObject(value,Cart.class);

        Long productIdOld = cart.getProductId();
        Long quantityOld = cart.getQuantity();

        if(prodcutId.longValue() == productIdOld.longValue()){
            Long newQuantity = quantityOld-quantity;
            cart.setQuantity(newQuantity);
        }else{
            return R.fail("商品不对");
        }

        //重新赋值
        this.redisTemplate.opsForValue().set(userReisKey,JSON.toJSONString(cart));

        //更新数据库
        this.iCartService.updateCart(cart);

        if(StringUtils.isNull(value)){
            return R.ok();
        }

        return R.ok(cart);

    }
}
